/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package beans.dao;

import beans.Cita;
import core.bd;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author nowxue
 */
public class CitaDAO {
    
    private static final Integer CITA_ASISTIDO = 3;
    private static final Integer CITA_INASISTIDO = 2;
    private static final Integer CITA_ASIGNADO = 1;
    private static final Integer CITA_DISPONIBLE = 0;
    
    public static boolean guardarCitas(Set<Cita> citas, String idPaciente, 
            String idEstado, String idMotivo, String observaciones){
        
        Connection conexion = null;

        String updateCita = "UPDATE cita set "
                + "id_paciente = ?, id_motivo=?, observacion=?, estado=? "
                + "WHERE id_cita = ?";
        
        String guardarCitaPaciente = "INSERT INTO citas_paciente("
                                       + "id, id_paciente, id_cita) "
                                       + " VALUES (?, ?, ?) ";
        boolean correcto = false;

        try {
            Integer ultimoIdGenerado = getUltimoIdGenerado() + 1;
            conexion = bd.getConexion();
            conexion.setAutoCommit(false);
            PreparedStatement actualizarCitas = conexion.prepareStatement(updateCita);
            Integer idPacienteInt= Integer.valueOf(idPaciente);
            System.out.println(String.format("Error : %s %s %s %s %s", 
                    ultimoIdGenerado, idPacienteInt, idEstado, idMotivo, observaciones));
            actualizarCitas.setInt(1, idPacienteInt);
            actualizarCitas.setInt(2, Integer.valueOf(idMotivo));
            actualizarCitas.setString(3, observaciones);
            actualizarCitas.setInt(4, Integer.valueOf(idEstado));
            
            PreparedStatement crearCitasPaciente = conexion.prepareStatement(guardarCitaPaciente);
            crearCitasPaciente.setInt(1, ultimoIdGenerado);
            crearCitasPaciente.setInt(2, idPacienteInt);
            
            for (Cita cita : citas) {
                Integer idCitaInt = cita.getIdCita();
                actualizarCitas.setInt(5, idCitaInt);
                crearCitasPaciente.setInt(3, idCitaInt);
                
                
                
                actualizarCitas.executeUpdate();
                crearCitasPaciente.executeUpdate();
                conexion.commit();
            }
            correcto = true;
        } catch (SQLException ex) {
            Logger.getLogger(CitaDAO.class.getName()).log(Level.SEVERE, null, ex);
            
        }
        return correcto;   
    }

    private static Integer getUltimoIdGenerado() throws SQLException {
             Connection conexion = null;
             
        PreparedStatement statement = null;
        ResultSet rs = null;
        
        Integer result = 1;
        
        conexion = bd.getConexion();
        statement = conexion.prepareStatement("select id from citas_paciente order by id desc limit 1");
        
        rs = statement.executeQuery();
        if (rs.next()) {
            result = rs.getInt("id");
        }
        return result;
    }
    
    private static Integer getIdCitaPaciente(Integer idCita) throws SQLException {
        Connection conexion = null;

        PreparedStatement statement = null;
        ResultSet rs = null;

        Integer result = null;

        conexion = bd.getConexion();
        statement = conexion.prepareStatement("select id from citas_paciente where id_cita = ?");
        statement.setInt(1, idCita);

        rs = statement.executeQuery();
        if (rs.next()) {
            result = rs.getInt("id");
        }
        return result;
    }
    
    public static boolean borrarCitas(String idCita){
        
        Connection conexion = null;
        
        boolean correcto = false;
        
        String updateCita = "update cita set id_paciente = null, "
                + "estado = '0', observacion = null, id_motivo = null where id_cita in (select id_cita from citas_paciente where id = ?)";
        String deleteCitaPac = "delete from citas_paciente where id = ?";
        
        try {    
            Integer idCitasPaciente = getIdCitaPaciente(Integer.valueOf(idCita));
            conexion = bd.getConexion();
            conexion.setAutoCommit(false);
            PreparedStatement actualizarCitas = conexion.prepareStatement(updateCita);
            actualizarCitas.setInt(1, idCitasPaciente);

            PreparedStatement borrarCitasPaciente = conexion.prepareStatement(deleteCitaPac);
            borrarCitasPaciente.setInt(1, idCitasPaciente);
            
            actualizarCitas.executeUpdate();
            borrarCitasPaciente.executeUpdate();
            conexion.commit();
            correcto = true;
        } catch (SQLException ex) {
            Logger.getLogger(CitaDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        return correcto;
    }
    
    public static boolean cambiarEstadoCitaAsistido(String idCitasPaciente){
        boolean correcto = false;
        
        Connection conexion = null;
        //DUDA cual es el estado de cita asistido
        String sentencia = "update cita set estado = ? where estado = ? and id_cita in ("
                + "select id_cita from citas_paciente where id = ?)";
        
        System.out.println("IdCitasPaciente: " + idCitasPaciente);
        Integer idCitas = Integer.valueOf(idCitasPaciente);
        try{
            conexion = bd.getConexion();
            conexion.setAutoCommit(false);
            PreparedStatement actualizarCitas = conexion.prepareStatement(sentencia);
            actualizarCitas.setInt(1, CITA_ASISTIDO);
            actualizarCitas.setInt(2, CITA_ASIGNADO);
            actualizarCitas.setInt(3, idCitas);
            actualizarCitas.executeUpdate();
            conexion.commit();
            correcto = true;
            
        }catch (SQLException ex) {
            Logger.getLogger(CitaDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        return correcto;
    }
    
      public static boolean esPlanillaEliminable(String idCita) throws Exception{
        boolean eliminable = false;
        
        Connection conexion = null;
        PreparedStatement statement = null;
        ResultSet rs = null;

        
        try {
            conexion = bd.getConexion();
            statement = conexion.prepareStatement(String.format(
                    "select count(*) as asignados from cita where "
                    + "id_planilla_horario = '%s' "
                    + " and id_paciente is not null and estado <> 0;"
                    , idCita));
            
            rs = statement.executeQuery();
            if (rs.next()) {
                eliminable = rs.getInt("asignados") == 0;
            }
        }catch(SQLException e){
            e.printStackTrace();
            throw new Exception("Error en la consulta SQL en PlanillaDao "
                    + "- esPlanillaEliminable");
        }
        
        return eliminable;
    }
    
    public static boolean cambiarEstadoCitaInasistido() {
        boolean correcto = false;

        Connection conexion = null;
        //DUDA cual es el estado de cita asistido
        String sentencia = "update cita set estado = ? where estado = ? and "
                + "id_paciente is not null and hora < (current_time - time '00:30')";

        try {
            conexion = bd.getConexion();
            conexion.setAutoCommit(false);
            PreparedStatement actualizarCitas = conexion.prepareStatement(sentencia);
            actualizarCitas.setInt(1, CITA_INASISTIDO);
            actualizarCitas.setInt(2, CITA_ASIGNADO);
            actualizarCitas.executeUpdate();
            conexion.commit();
            correcto = true;

        } catch (SQLException ex) {
            Logger.getLogger(CitaDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        return correcto;
    }
      
}